#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
read_conf.py - 配置文件读取模块

该模块提供了多种配置文件读取功能，包括：
1. 通用配置文件读取
2. PV字典读取
3. PV列表读取
4. 数据列表读取
5. 文件写入

支持的文件格式：
- 支持注释（以#开头）
- 支持空行
- 支持多种分隔符（空格、逗号等）
"""

import re

def readConfFile(file_name):
    """
    读取通用配置文件
    
    功能：
    1. 读取文件内容
    2. 忽略注释和空行
    3. 将每行数据转换为元组
    4. 自动转换数字字符串为浮点数
    
    参数：
        file_name (str): 配置文件路径
        
    返回：
        list: 包含数据元组的列表
    """
    try:
        file_object = open(file_name, 'r')
        lines = file_object.readlines()
    finally:
        if file_object:
            file_object.close()
    raw_data = []
    for line in lines:
        if re.search(r'^$|^#', line):  # 跳过空行和注释行
            continue
        else:
            line = re.sub(r'\s+#.+|\s+\n|\n', '', line)  # 移除注释和换行符
            pv_list = re.sub(r'\s+', ',', line)  # 将空白字符替换为逗号
            pv_list = pv_list.split(',')
            for i in range(len(pv_list)):
                if re.search(r'^[+-]?\d+', pv_list[i]):  # 如果是数字字符串
                    pv_list[i] = float(pv_list[i])  # 转换为浮点数
                else:
                    continue
            param_tuple = tuple(pv_list)
            raw_data.append(param_tuple)
    print ("Amount of data:", len(raw_data), ", read from file:", file_name)
    return raw_data
    
def readPVDict(file_name):
    """
    读取PV字典配置文件
    
    功能：
    1. 读取文件内容
    2. 忽略注释和空行
    3. 将每行数据转换为键值对
    4. 自动转换数字字符串为浮点数
    
    参数：
        file_name (str): 配置文件路径
        
    返回：
        dict: 包含PV配置的字典
    """
    try:
        file_object = open(file_name, 'r')
        lines = file_object.readlines()
    finally:
        if file_object:
            file_object.close()
    raw_data = {}
    for line in lines:
        if re.search(r'^$|^#', line):  # 跳过空行和注释行
            continue
        else:
            line = re.sub(r'\s+#.+|\s+\n|\n', '', line)  # 移除注释和换行符
            pv_list = re.sub(r'\s+', '', line)  # 移除所有空白字符
            pv_list = pv_list.split('=')
            if re.search(r'^[0-9+-]+\.{0,1}[0-9e+-]{0,}$', pv_list[1]):  # 如果是数字字符串
                raw_data[pv_list[0]] = pv_list[1]  # 保持字符串格式
            else:
                raw_data[pv_list[0]] = pv_list
    print ("Amount of data:", len(raw_data), ", read from file:", file_name)
    return raw_data

def readPVList(file_name):
    """
    读取PV列表配置文件
    
    功能：
    1. 读取文件内容
    2. 忽略注释和空行
    3. 将每行数据转换为列表
    
    参数：
        file_name (str): 配置文件路径
        
    返回：
        list: 包含PV列表的列表
    """
    try:
        file_object = open(file_name, 'r')
        lines = file_object.readlines()
    finally:
        if file_object:
            file_object.close()
    raw_data = []
    for line in lines:
        if re.search(r'^$|^#', line):  # 跳过空行和注释行
            continue
        else:
            line = re.sub(r'\s+#.+|\s+\n|\n', '', line)  # 移除注释和换行符
            pv_list = re.sub(r'\s+', ',', line)  # 将空白字符替换为逗号
            pv_list = pv_list.split(',')
            raw_data.append(pv_list)
    print ("Amount of data:", len(raw_data), ", read from file:", file_name)
    return raw_data

def readDataList(file_name):
    """
    读取数据列表配置文件
    
    功能：
    1. 读取文件内容
    2. 忽略注释和空行
    3. 将每行数据转换为数字列表
    4. 自动转换所有数据为浮点数
    
    参数：
        file_name (str): 配置文件路径
        
    返回：
        list: 包含数字数据的列表
    """
    try:
        file_object = open(file_name, 'r')
        lines = file_object.readlines()
    finally:
        if file_object:
            file_object.close()
    raw_data = []
    for line in lines:
        if re.search(r'^$|^#', line):  # 跳过空行和注释行
            continue
        else:
            line = re.sub(r'\s+#.+|\s+\n|\n', '', line)  # 移除注释和换行符
            data_list = re.sub(r'\s+', ',', line)  # 将空白字符替换为逗号
            data_list = data_list.split(',')
            for i in range(len(data_list)):
                data_list[i] = float(data_list[i])  # 转换为浮点数
            if len(data_list) == 1:
                raw_data.append(data_list[0])  # 单个数据直接添加
            else:
                raw_data.append(data_list)  # 多个数据作为列表添加
    print ("Amount of data:", len(raw_data), ", read from file:", file_name)
    return raw_data

def writeFile(file_name, line):
    """
    写入数据到文件
    
    功能：
    1. 以追加模式打开文件
    2. 写入数据并添加换行符
    
    参数：
        file_name (str): 文件路径
        line (str): 要写入的数据行
    """
    with open(file_name, 'a') as file_object:
        file_object.write(line+'\n')

def main():
    """
    主函数（空实现）
    """
    pass
    
if __name__ == "__main__":
    main()
